function procImg(isLvl,isRed){
    if (document.getElementsByClassName('sourceImage').length == 0){
       alert('First select image');
       return;
    }

    var palInd=epdArr[epdInd][2];

    if (isRed&&((palInd&1)==0)){
       alert('This white-black display');
       return;
    }

    if (!isRed)palInd=palInd&0xFE;
    curPal=palArr[palInd];
    getElm('dstBox').innerHTML='<span class=\"title\">Processed Image</span><br><canvas id=\"canvas\"></canvas>'; 
    var canvas=getElm('canvas');
    sW=srcImg.width;
    sH=srcImg.height;
    source=getElm('source');
    // source.width=sW;
    // source.height=sH;
    // source.getContext('2d').drawImage(srcImg,0,0,sW,sH);
    dX=parseInt(getElm('nud_x').value);
    dY=parseInt(getElm('nud_y').value);
    dW=parseInt(getElm('nud_w').value);
    dH=parseInt(getElm('nud_h').value);

    if((dW<3)||(dH<3)){
       alert('Image is too small');
       return;
    }

    canvas.width=dW;
    canvas.height=dH;
    var index=0;
    var pSrc=source.getContext('2d').getImageData(0,0,sW,sH);
    var pDst=canvas.getContext('2d').getImageData(0,0,dW,dH);

    if(isLvl){
       for (var j=0;j<dH;j++){
           var y=dY+j;
           if ((y<0)||(y>=sH)){
               for (var i=0;i<dW;i++,index+=4) setVal(pDst,index,(i+j)%2==0?1:0);
               continue;
           }
           
           for (var i=0;i<dW;i++){
               var x=dX+i;
               
               if ((x<0)||(x>=sW)){
                    setVal(pDst,index,(i+j)%2==0?1:0);
                    index+=4;
                    continue;
                }
                
                var pos=(y*sW+x)*4;     
                setVal(pDst,index,getNear(pSrc.data[pos],pSrc.data[pos+1],pSrc.data[pos+2]));
                index+=4;
            }
        }
    }else{
       var aInd=0;
       var bInd=1;
       var errArr=new Array(2);
       errArr[0]=new Array(dW);
       errArr[1]=new Array(dW);
    
       for (var i=0;i<dW;i++)
          errArr[bInd][i]=[0,0,0];
          
       for (var j=0;j<dH;j++){
          var y=dY+j;
          
          if ((y<0)||(y>=sH)){
              for (var i=0;i<dW;i++,index+=4)setVal(pDst,index,(i+j)%2==0?1:0);  
              continue;
          }
          
          aInd=((bInd=aInd)+1)&1;
          for (var i=0;i<dW;i++)errArr[bInd][i]=[0,0,0];
          
          for (var i=0;i<dW;i++){
              var x=dX+i;
              
              if ((x<0)||(x>=sW)){
                  setVal(pDst,index,(i+j)%2==0?1:0);
                  index+=4;
                  continue;
              }
              
              var pos=(y*sW+x)*4;
              var old=errArr[aInd][i];
              var r=pSrc.data[pos  ]+old[0];
              var g=pSrc.data[pos+1]+old[1];
              var b=pSrc.data[pos+2]+old[2];
              var colVal = curPal[getNear(r,g,b)];
              pDst.data[index++]=colVal[0];
              pDst.data[index++]=colVal[1];
              pDst.data[index++]=colVal[2];
              pDst.data[index++]=255;
              r=(r-colVal[0]);
              g=(g-colVal[1]);
              b=(b-colVal[2]);
            
              if (i==0){
                  errArr[bInd][i  ]=addVal(errArr[bInd][i  ],r,g,b,7.0);
                  errArr[bInd][i+1]=addVal(errArr[bInd][i+1],r,g,b,2.0);
                  errArr[aInd][i+1]=addVal(errArr[aInd][i+1],r,g,b,7.0);
              }else if (i==dW-1){
                  errArr[bInd][i-1]=addVal(errArr[bInd][i-1],r,g,b,7.0);
                  errArr[bInd][i  ]=addVal(errArr[bInd][i  ],r,g,b,9.0);
              }else{
                  errArr[bInd][i-1]=addVal(errArr[bInd][i-1],r,g,b,3.0);
                  errArr[bInd][i  ]=addVal(errArr[bInd][i  ],r,g,b,5.0);
                  errArr[bInd][i+1]=addVal(errArr[bInd][i+1],r,g,b,1.0);
                  errArr[aInd][i+1]=addVal(errArr[aInd][i+1],r,g,b,7.0);
              }
          }
       }
    }

    canvas.getContext('2d').putImageData(pDst,0,0);
}